package com.bangdao.juc;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @author chen
 * @create 2021-01-03
 */

/**
 * 1. 为了防止主线程阻塞，建议get方法放到最后
 * 2. 只计算一次，FutureTask会复用之前计算过得结果
 */
public class CallableDemo {
    public static void main(String[] args) {
        FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
        new Thread(futureTask).start();
        //第一种方法：join阻塞
//        new Thread().join();
        //第二种方法:轮询方法
        while (!futureTask.isDone()){
            System.out.println("执行完了吗?....");
        }
        //执行主线程业务逻辑
        System.out.println("这是主线程的业务逻辑。。。。。");
        //第三种方法： get()方法也会阻塞 一般放到代码的最后执行
//        try {
//            System.out.println("获取子线程的返回结果集 = " + futureTask.get());
//        } catch (Exception e) {
//            System.out.println("已经捕获到异常信息：" + e.getMessage());
//        }
    }
}

class MyCallable implements Callable<String> {

    @Override
    public String call() throws Exception {
        //睡
        TimeUnit.SECONDS.sleep(200);
        System.out.println("这是Callable的实现方式。。。。");
//        int i = 1 / 0;
        return "hello callable";
    }
}